<template>
  <div :id="id" class="playWnd"
  :style="{ width: swfWidth + 'px', height: swfHeight + 'px' }">
  </div>
</template>

<script>
const $ = window.$;
export default {
  props: ['id', 'swfHeight', 'swfWidth', 'appkey', 'secret', 'port', 'ip', 'ichannelId', 'layout', 'playMode'],
  data() {
    return {
      form: {
        videogroupnameLike: ''
      },
      loading: false,
      playUrl: '',
      // 初始化参数
      initparam: {
        appKey: '',
        secret: '',
        apiIp: '',
        apiPort: '',
        layout: '1x2'// 这里是来控制你一开始初始化之后的分屏的
      },
      // playMode: 0, // 0实时 1 历史
      pubKey: '',
      oWebControl: null,
      WebControl: null,
      JSEncrypt: null,
      flag: true,
      videoList: [],
      currentKey: ''
    };
  },
  methods: {
    // 创建播放实例
    initPlugin() {
      // console.log('这是jquery', $);
      this.oWebControl = new this.WebControl({
        szPluginContainer: this.id, // 指定容器id
        iServicePortStart: 15900, // 指定起止端口号，建议使用该值
        iServicePortEnd: 15909,
        szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
        // 创建WebControl实例成功
        cbConnectSuccess: () => {
          this.oWebControl
            .JS_StartService('window', {
              // WebControl实例创建成功后需要启动服务
              dllPath: './VideoPluginConnect.dll' // 值'./VideoPluginConnect.dll'写死
            })
            .then(
              () => {
                // 启动插件服务成功
                this.oWebControl.JS_SetWindowControlCallback({
                  // 设置消息回调
                  cbIntegrationCallBack: this.cbIntegrationCallBack
                });

                this.oWebControl
                  .JS_CreateWnd(this.id, this.swfWidth, this.swfHeight)
                  .then(() => {
                    console.log('JS_CreateWnd success');
                    this.$emit('onSuccess');
                    // JS_CreateWnd创建视频播放窗口，宽高可设定
                    this.init(); // 创建播放实例成功后初始化
                  });
              },
              () => {
                // 启动插件服务失败
              }
            );
        },
        // 创建WebControl实例失败
        cbConnectError: () => {
          const id = this.id;
          this.oWebControl = null;
          $('#' + id).html('插件未启动，正在尝试启动，请稍候...');
          this.WebControl.JS_WakeUp('VideoWebPlugin://'); // 程序未启动时执行error函数，采用wakeup来启动程序
          this.initCount++;
          if (this.initCount < 3) {
            setTimeout(() => {
              this.initPlugin();
            }, 100);
          } else {
            this.$message.error('插件启动失败，请检查插件是否安装!');
          }
        },
        // 异常断开：bNormalClose = false
        cbConnectClose: bNormalClose => {
          // JS_Disconnect正常断开：bNormalClose = true
          // console.log('cbConnectClose');
          this.oWebControl = null;
        }
      });
    },
    // 设置窗口控制回调
    setCallbacks() {
      this.oWebControl.JS_SetWindowControlCallback({
        cbIntegrationCallBack: this.cbIntegrationCallBack
      });
    },
    // 推送消息
    cbIntegrationCallBack(oData) {
      // console.log(oData.responseMsg);
      // showCBInfo(JSON.stringify(oData.responseMsg));
    },
    // 初始化
    init() {
      this.getPubKey(() => {
        // 请自行修改以下变量值
        var appkey = this.appkey;// this.initparam.appKey; // 综合安防管理平台提供的appkey，必填
        var secret = this.setEncrypt(this.secret);// this.setEncrypt(this.initparam.secret); // 综合安防管理平台提供的secret，必填
        var ip = this.ip;// this.initparam.apiIp; // 综合安防管理平台IP地址，必填
        var playMode = this.playMode; // 初始播放模式：0-预览，1-回放
        var port = parseInt(this.port);// parseInt(this.initparam.apiPort); // 综合安防管理平台端口，若启用HTTPS协议，默认443
        var snapDir = 'D:\\SnapDir'; // 抓图存储路径
        var videoDir = 'D:\\VideoDir'; // 紧急录像或录像剪辑存储路径
        var layout = this.layout; // playMode指定模式的布局
        var enableHTTPS = 0;// 1; // 是否启用HTTPS协议与综合安防管理平台交互，这里总是填1
        var encryptedFields = 'secret'; // 加密字段，默认加密领域为secret
        var showToolbar = 1; // 是否显示工具栏，0-不显示，非0-显示
        var showSmart = 0; // 是否显示智能信息（如配置移动侦测后画面上的线框），0-不显示，非0-显示
        var buttonIDs = '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769'; // 自定义工具条按钮
        // 请自行修改以上变量值

        const o = {
          appkey: appkey, // API网关提供的appkey
          secret: secret, // API网关提供的secret
          ip: ip, // API网关IP地址
          playMode: playMode, // 播放模式（决定显示预览还是回放界面）
          port: port, // 端口
          snapDir: snapDir, // 抓图存储路径
          videoDir: videoDir, // 紧急录像或录像剪辑存储路径
          layout: layout, // 布局
          enableHTTPS: enableHTTPS, // 是否启用HTTPS协议
          encryptedFields: encryptedFields, // 加密字段
          showToolbar: showToolbar, // 是否显示工具栏
          showSmart: showSmart, // 是否显示智能信息
          buttonIDs: buttonIDs // 自定义工具条按钮
        };

        this.oWebControl.JS_RequestInterface({
          funcName: 'init',
          argument: JSON.stringify(o)
        })
          .then(oData => {
            // this.oWebControl.JS_Resize(1000, 600)
            this.oWebControl.JS_Resize(this.swfWidth, this.swfHeight); // 初始化后resize一次，规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
            this.startpreview();
          });
      });
    },
    hideVideo() {
      this.oWebControl.JS_CuttingPartWindow(0, 0, this.swfWidth + 1, this.swfHeight + 1);
    },
    showVideo() {
      this.oWebControl.JS_RepairPartWindow(0, 0, this.swfWidth + 1, this.swfHeight + 1);
    },
    // 获取公钥
    getPubKey(callback) {
      this.oWebControl
        .JS_RequestInterface({
          funcName: 'getRSAPubKey',
          argument: JSON.stringify({
            keyLength: 1024
          })
        })
        .then(oData => {
          if (oData.responseMsg.data) {
            this.pubKey = oData.responseMsg.data;
            callback();
          }
        });
    },
    // RSA加密
    setEncrypt(value) {
      const encrypt = new this.JSEncrypt();
      encrypt.setPublicKey(this.pubKey);
      return encrypt.encrypt(value);
    },
    // 设置窗口裁剪，当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口
    setWndCover() {
      const id = this.id;
      const iWidth = $(window).width();
      const iHeight = $(window).height();
      const oDivRect = $('#' + id)
        .get(0)
        .getBoundingClientRect();
      let iCoverLeft = oDivRect.left < 0 ? Math.abs(oDivRect.left) : 0;
      let iCoverTop = oDivRect.top < 0 ? Math.abs(oDivRect.top) : 0;
      let iCoverRight =
        oDivRect.right - iWidth > 0 ? Math.round(oDivRect.right - iWidth) : 0;
      let iCoverBottom =
        oDivRect.bottom - iHeight > 0
          ? Math.round(oDivRect.bottom - iHeight)
          : 0;

      iCoverLeft = iCoverLeft > this.swfWidth ? this.swfWidth : iCoverLeft;
      iCoverTop = iCoverTop > this.swfHeight ? this.swfHeight : iCoverTop;
      iCoverRight = iCoverRight > this.swfWidth ? this.swfWidth : iCoverRight;
      iCoverBottom =
        iCoverBottom > this.swfHeight ? this.swfHeight : iCoverBottom;
      this.oWebControl.JS_RepairPartWindow(0, 0, this.swfWidth + 1, this.swfHeight); // 多1个像素点防止还原后边界缺失一个像素条
      if (iCoverLeft !== 0) {
        this.oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, this.swfHeight);
      }
      if (iCoverTop !== 0) {
        this.oWebControl.JS_CuttingPartWindow(0, 0, this.swfWidth + 1, iCoverTop); // 多剪掉一个像素条，防止出现剪掉一部分窗口后出现一个像素条
      }
      if (iCoverRight !== 0) {
        this.oWebControl.JS_CuttingPartWindow(
          this.swfWidth - iCoverRight,
          0,
          iCoverRight,
          this.swfHeight
        );
      }
      if (iCoverBottom !== 0) {
        this.oWebControl.JS_CuttingPartWindow(
          0,
          this.swfHeight - iCoverBottom,
          this.swfWidth,
          iCoverBottom
        );
      }
    },
    // 手动播放
    manualpreview(id) {
      const streamMode = 0; // 主子码流标识：0-主码流，1-子码流
      const transMode = 1; // 传输协议：0-UDP，1-TCP
      const gpuMode = 0; // 是否启用GPU硬解，0-不启用，1-启用
      // const wndId = -1; // 播放窗口序号（在2x2以上布局下可指定播放窗口）
      // this.cameraindexcode = this.cameraindexcode.replace(/(^\s*)/g, '');

      this.oWebControl.JS_RequestInterface({
        funcName: 'startPreview',
        argument: JSON.stringify(
          {
            cameraIndexCode: id.replace(/(^\s*)/g, ''), // 监控点编号
            streamMode: streamMode, // 主子码流标识
            transMode: transMode, // 传输协议
            gpuMode: gpuMode // 是否开启GPU硬解
            // wndId: 1 // 可指定播放窗口
          }
        )
      }).then((res) => {
        console.log('预览成功', res);
      });
    },
    backVideo(startTime, endTime, cameraIndexCode) {
      this.oWebControl.JS_RequestInterface({
        funcName: 'startPlayback',
        argument: JSON.stringify({
          cameraIndexCode: cameraIndexCode, // 监控点编号
          startTimeStamp: startTime, // 录像查询开始时间戳，单位：秒
          endTimeStamp: endTime, // 录像查询结束时间戳，单位：秒
          recordLocation: 0, // 录像存储类型 0-中心存储 1-设备存储
          transMode: 1, // 传输协议 ，0-UDP 1-TCP
          gpuMode: 0, // 是否开启 GPU 硬解，0-不开启 1-开启
          wndId: -1 // 可指定播放窗口
        })
      }).then((res) => {
        console.log('then', res);
      });
    },
    startpreview() {
      const streamMode = 0; // 主子码流标识：0-主码流，1-子码流
      const transMode = 1; // 传输协议：0-UDP，1-TCP
      const gpuMode = 0; // 是否启用GPU硬解，0-不启用，1-启用
      // const wndId = -1; // 播放窗口序号（在2x2以上布局下可指定播放窗口）
      // this.cameraindexcode = this.cameraindexcode.replace(/(^\s*)/g, '');
      if (this.ichannelId.length) {
        this.stop().then(_ => {
          console.log('stop!!', this.ichannelId);
          this.ichannelId.forEach((item, index) => {
            this.oWebControl.JS_RequestInterface({
              funcName: 'startPreview',
              argument: JSON.stringify(
                {
                  cameraIndexCode: item.replace(/(^\s*)/g, ''), // 监控点编号
                  streamMode: streamMode, // 主子码流标识
                  transMode: transMode, // 传输协议
                  gpuMode: gpuMode, // 是否开启GPU硬解
                  wndId: ++index // 可指定播放窗口
                }
              )
            }).then((res) => {
              console.log('预览成功', res);
            });
          });
        });
      }
    },
    // 关闭视频窗口
    closeWindow() {
      return new Promise((resolve, reject) => {
        console.log(`this.oWebControl`, this.oWebControl);
        if (this.oWebControl) {
          this.oWebControl.JS_HideWnd();
          this.oWebControl.JS_Disconnect().then(
            () => {
              resolve();
            },
            () => {
            }
          );
        }
      });
    },
    // 停止全部预览
    stop() {
      return new Promise((resolve, reject) => {
        this.oWebControl.JS_RequestInterface({
          funcName: 'stopAllPreview'
        }).then(res => {
          resolve();
        });
      });
    },
    previewClick() {
      if (this.oWebControl) {
        this.startpreview();
      }
    }
  },
  mounted() {
    this.WebControl = window.WebControl;
    this.JSEncrypt = window.JSEncrypt;
    this.initPlugin();
  },
  beforeDestroy() {
    this.closeWindow();
  }
};
</script>

<style>

</style>